package utils

import (
	"strings"

	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gconv"
)

// 验证订时字符串内容
func CheckCronTimeStr(TimeStr string) bool {
	TimeList := strings.Split(TimeStr, " ")
	InitValue := 0
	endValue := 60
	for Index, TimeStr1 := range TimeList {
		if Index == 0 || Index == 1 {
			InitValue = 0
			endValue = 59
		} else if Index == 2 {
			InitValue = 0
			endValue = 23
		} else if Index == 3 {
			InitValue = 1
			endValue = 31
		} else if Index == 4 {
			InitValue = 1
			endValue = 12
		} else if Index == 5 {
			InitValue = 1
			endValue = 7
		} else if Index == 6 {
			InitValue = 2020
			endValue = 2050
		}
		g.Log().Debug("CheckCronTimeStr:%d  %s", Index, TimeStr1)
		if TimeStr1 == "*" {
			continue
		} else if (Index == 3 || Index == 5) && TimeStr1 == "?" {
			continue
		} else if strings.Contains(TimeStr1, "/") {
			ValueList := strings.Split(TimeStr1, "/")
			if len(ValueList) != 2 {
				g.Log().Errorf("订时字符串区间内容错误：格式*/1 %s", TimeStr)
				return false
			}
			if ValueList[0] != "*" {
				g.Log().Errorf("订时字符串区间内容错误：格式*/1 %s", TimeStr)
				return false
			} else {
				v2 := gconv.Int(ValueList[1])
				if !(InitValue <= v2 && v2 <= endValue) {
					g.Log().Errorf("订时字符串区间字段内容错误 %d-%d:%s", InitValue, endValue, TimeStr)
					return false
				}
			}

		} else if strings.Contains(TimeStr1, "-") {
			ValueList := strings.Split(TimeStr1, "-")
			if len(ValueList) != 2 {
				g.Log().Errorf("订时字符串范围内容错误：格式1-3 %s", TimeStr)
				return false
			}
			v1 := gconv.Int(ValueList[0])
			v2 := gconv.Int(ValueList[1])
			if v1 >= v2 {
				g.Log().Errorf("订时字符串范围内容要从小到大:%s", TimeStr)
				return false
			}
			if v1 >= v2 {
				g.Log().Errorf("订时字符串范围内容要从小到大:%s", TimeStr)
				return false
			} else if !(InitValue <= v1 && v1 <= endValue && InitValue <= v2 && v2 <= endValue) {
				g.Log().Errorf("订时字符串字段范围内容错误 %d-%d:%s", InitValue, endValue, TimeStr)
				return false
			}
		} else if strings.Contains(TimeStr1, ",") {
			ValueList := strings.Split(TimeStr1, ",")
			if len(ValueList) >= endValue {
				g.Log().Errorf("订时字符串分段内容错误：格式1-3 %s", TimeStr)
				return false
			}
			v0 := 0
			for _, VV := range ValueList {
				v1 := gconv.Int(VV)
				if v0 >= v1 {
					g.Log().Errorf("订时字符串分段内容要从小到大：格式1,2,3... %s", TimeStr)
					return false
				}
				v0 = v1
			}
		} else {
			v1 := gconv.Int(TimeStr1)
			if !(InitValue <= v1 && v1 <= endValue) {
				g.Log().Errorf("订时字符串字段内容错误 要在%d-%d之间:%s", InitValue, endValue, TimeStr)
				return false
			}
		}
	}
	return true
}
